7.7. ¿Cómo funcionan los scripts de arranque?

Linux utiliza como sistema de inicio SysVinit que se basa en un concepto de run-levels. Puede ser muy diferente de un sistema a otro, por lo que no puede suponer que porque las cosas funcionen en una distribución de Linux en particular, deben trabajar en LFS también. LFS tiene su propia manera de hacer las cosas, pero respeta los estándares aceptados.

SysVinit (que se conocerá como init de ahora en adelante) funciona mediante un esquema de niveles de ejecución. Hay siete (numerados del 0 al 6)-niveles (en realidad, hay más niveles de ejecución, pero son para casos especiales y por lo general no se utilizan. Véase init(8) para mayores detalles), y cada uno de ellos indica las acciones que se supone que el ordenador realizará cuando se inicia. El nivel de ejecución por defecto es 3. Aquí están las descripciones de los diferentes niveles de ejecución:

0: parada del sistema
1: modo monousuario
2: modo mode multiusuario sin red
3: modo multiususario con red
4: reservado para personalizar, similar al modo 3   
5: igual que 4, se utiliza usualmente para iniciar el entorno grágico (como X's xdm o KDE's kdm)
6: reinicia el sistema

7.7.1. Configuración Sysvinit

Durante la inicialización del núcleo, el primer programa que se ejecuta se especifica ya sea en la línea de comandos o por defecto, es init.Este programa lee el archivo de inicialización /etc/inittab. Crea este archivo con:

cat > /etc/inittab << "EOF"
# Begin /etc/inittab

id:3:initdefault:

si::sysinit:/etc/rc.d/init.d/rc S

l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

su:S016:once:/sbin/sulogin

1:2345:respawn:/sbin/agetty --noclear tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600

# End /etc/inittab
EOF

Una explicación de este archivo de inicialización se encuentra en la página del manual de inittab. Para LFS, el comando llave que se ejecuta es rc. El archivo de inicialización anterior instruiráa rc para ejecutar todos los scripts que comienzan con una S en el directorio /etc/rc.d/rcS.d seguido por todos los scripts que comienzan con una S en el archivo /etc/rc.d/rc?.d donde el signo de interrogación se especifica mediante el valor initdefault.

Para su conveniencia, el scriptrc lee una biblioteca de funciones en/lib/lsb/init-functions. Esta biblioteca también lee un archivo de configuración opcional, /etc/sysconfig/rc.site. Cualquiera de los parámetros del archivo de configuración del sistema que se describen en las secciones siguientes se pueden colocar alternativamente en este archivo que permite la consolidación de todos los parámetros del sistema en este archivo.

Para comodidad de depuración, el script también registra toda salida a /run/var/bootlog. Desde que el directorio /run es tmpfs, este archivo no es persistente a través de reinicios, sin embargo se añade al archivo de mayor permanencia /var/log/boot.log al final del proceso de arranque.

7.7.2. Cambio de los niveles de ejecución

El cambio en los niveles de ejecución se hace coninit <runlevel>, donde <runlevel> es el run-level destino. Por ejemplo, para reiniciar el ordenador, un usuario podría ejecutar el comando init 6el cual es un alias del comando reboot.Del mismo modo init 0 es un alias para el comando halt.

Hay una serie de directorios bajo /etc/rc.d de la forma rc?.d (donde? es el número de run-level) y el directorio rcsysinit.d, que contiene una serie de enlaces simbólicos. Algunos comienzan con una K, y otros con una S, y todos ellos tienen dos números después de la letra inicial. El K indican la parada (kill) de un servicio y la S significa iniciar un servicio. Los números determinan el orden en que se ejecutan los scripts, de 00 a 99 -mientras más bajo es el número, antes se ejecutará. Cuando init cambia a otro nivel de ejecución, los servicios apropiados son iniciados o parados, dependiendo del nivel de ejecución elegido.

Los scripts reales se hallan en /etc/rc.d/init.d. Ellos hacen el trabajo real, y los enlaces simbólicos apuntan a ellos. Enlaces K y enlaces S apuntan a la misma secuencia de comandos en /etc/rc.d/init.d. Esto se debe a que los scripts pueden ser llamados con parámetros como start, stop, restart, reload, y status. Cuando se encuentra un enlace K, el script adecuado se ejecuta con el argumento stopCuando se encuentra un enlace S, el script adecuado se ejecuta con el argumento start.

Hay una excepción a esta explicación. Los enlaces que comienzan por S en los directorios rc0.d y rc6.d no inician nada. Ellos serán llamados con el parámetro stop para parar algo. La lógica detrás de esto es que cuando un usuario va a parar o reiniciar el sistema, nada hay que empezar. El sistema sólo debe ser detenido.

Estas son descripciones de lo que cada parámetro indica a los sacripts que hagan:

start

Se inicia el servicio.

stop

El servicio se detiene.

restart

El servicio se detiene y se vuelve a iniciar.

reload

La configuración del servicio se actualiza. Esto se utiliza después de que se modificó el archivo de configuración de un servicio, cuando el servicio no necesita ser reiniciado.

status

Indica si el servicio se está ejecutando y con qué PID.

Siéntase libre de modificar la forma en que el proceso de arranque se comporta (después de todo, es su propio sistema LFS). Lo aquí expuesto es un ejemplo de cómo se puede hacer.